package controllers

import (
	"crmObject/models"
	"crmObject/util"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	"github.com/gomodule/redigo/redis"
	"strconv"
)

type CustomerDevelopmentPlansController struct {
	beego.Controller
}

var cdps []models.CustomerDevelopmentPlans
var cdp models.CustomerDevelopmentPlans

//添加客户开发计划

func (c *CustomerDevelopmentPlansController) AddCustomerDevelopmentPlans() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &cdp)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//TODO 判断接收的信息是否为空
	//TODO session名规定为常量
	//获取本次插入营销机会的人id(创建人)
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)
	cdp.CreateUser = user.Username
	newOrm := orm.NewOrm()
	//TODO 优化客户和联系人是一对多关系
	//通过客户姓名拿到对应的联系人id,先拿到客户的id,在拿联系人的id
	customers.CustomerName = cdp.Customers.CustomerName
	//第一个参数为对象,第二个参数是对应的对象的条件参数
	//客户外键
	err = newOrm.Read(&customers, "CustomerName")
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//插入时间,不需要插入,通过orm关键字,插入时会自动生成
	//要转换的字符串时间
	//formatTime := time.Now().Format("2006-01-02 15:04:05")
	//时间字符串的格式
	//format := "2006-01-02 15:04:05"
	//parseTime, err := time.Parse(format, formatTime)
	//if err != nil {
	//	c.Data["json"] = LoginResponse{Success: false, Message: "请求解析失败"}
	//	c.ServeJSON()
	//	return
	//}
	//marketingOpportunities.AddTime = parseTime
	//更新时间
	//marketingOpportunities.UpdateTime = parseTime
	//插入customers_id外键
	cdp.Customers = &customers
	cdp.PlanID = 0
	_, err = newOrm.Insert(&cdp)
	fmt.Println(err)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	defer conn.Close()
	c.ServeJSON()
}

//删除客户开发计划

func (c *CustomerDevelopmentPlansController) DeleteCustomerDevelopmentPlans() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &cdp)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	newOrm := orm.NewOrm()
	//delete不需要外键会直接删除
	_, err = newOrm.Delete(&cdp)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//展示要修改客户开发计划

func (c *CustomerDevelopmentPlansController) SelectUpdateCustomerDevelopmentPlans() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &cdp)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	newOrm := orm.NewOrm()
	err = newOrm.QueryTable(&cdp).Filter("plan_i_d", cdp.PlanID).RelatedSel().One(&cdp)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	c.Data["json"] = map[string]interface{}{
		"PlanID":           cdp.PlanID,
		"PlanName":         cdp.PlanName,
		"PlanStatus":       cdp.PlanStatus,
		"CusDevelopValDes": cdp.CusDevelopValDes,
		"CustomerName":     cdp.Customers.CustomerName,
	}
	c.ServeJSON()
}

//修改客户开发计划

func (c *CustomerDevelopmentPlansController) UpdateCustomerDevelopmentPlans() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &cdp)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//TODO 判断值是否为空
	//TODO 判断哪些值是需要修改的
	newOrm := orm.NewOrm()
	//更新时间
	//formatTime := time.Now().Format("2006-01-02 15:04:05")
	//时间字符串的格式
	//format := "2006-01-02 15:04:05"
	//parseTime, err := time.Parse(format, formatTime)
	//mo.UpdateTime = parseTime
	//session中获取是谁修改了,如果不是本人就要修改usersId
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)
	cdp.CreateUser = user.Username
	defer conn.Close()
	//通过客户姓名拿到对应的联系人id,先拿到客户的id,在拿联系人的id
	customers.CustomerName = cdp.Customers.CustomerName
	//客户外键
	err = newOrm.Read(&customers, "CustomerName")
	cdp.Customers = &customers
	//update方法可以根据结构体中的主键直接作为条件  //修改外键值时----列名是结构体对象名或者对应的参数名
	_, err = newOrm.Update(&cdp, "plan_name", "plan_status", "cus_develop_val_des", "create_user", "Customers")
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//查询所有客户开发计划数据

func (c *CustomerDevelopmentPlansController) ListCustomerDevelopmentPlans() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	//当前页
	pageNoStr := c.GetString("pageNo")
	if pageNoStr == "" {
		//参数为空,错误处理
		//errCode := 505
		//newError := util.NewError(errCode)
		//c.Data["error"] = newError
		//c.TplName = "error.html"
		pageNoStr = "1"
	}

	newOrm := orm.NewOrm()
	pageNo, err := strconv.Atoi(pageNoStr)
	//总记录数
	totalPageCount, err := newOrm.QueryTable("CustomerDevelopmentPlans").Count()
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	pagination := util.NewPagination(int(totalPageCount), pageNo, util.PAGESIZE)
	_, err = newOrm.QueryTable("CustomerDevelopmentPlans").RelatedSel().Limit(util.PAGESIZE, (pageNo-1)*util.PAGESIZE).All(&cdps)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	c.Data["cdp"] = cdps
	c.Data["page"] = pagination

	//userSession := c.GetSession("users")
	//if userSession == nil {
	//	if err != nil {
	//		fmt.Println(err)
	//		errCode := 500
	//		newError := util.NewError(errCode)
	//		c.Data["error"] = newError
	//		c.TplName = "error.html"
	//	}
	//}
	//users := userSession.(models.Users)
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)
	c.Data["user"] = user
	defer conn.Close()
	c.TplName = "cdtables.html"
}

// 关键字搜索

func (c *CustomerDevelopmentPlansController) SelectCustomerDevelopmentPlans() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &cdp)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	planName := cdp.PlanName
	customersName := cdp.Customers.CustomerName
	newOrm := orm.NewOrm()
	//if customersName != "" {
	//	//获取对应customer外键值,用于作为查询的条件
	//	customers = models.Customers{CustomerName: customersName}
	//	err = newOrm.Read(&customers, "CustomerName")
	//	if err != nil {
	//		c.Data["json"] = LoginResponse{Success: false, Message: "查询数据为空"}
	//		c.ServeJSON()
	//		return
	//	}
	//	cdp.Customers = &customers
	//}

	//TODO 虚假数据
	pagination := util.NewPagination(4, 1, util.PAGESIZE)
	if planName == "" && customersName == "" {
		fmt.Println(err)
		errCode := 505
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	} else if planName != "" {
		if customersName != "" {
			//两个都存在
			_, err = newOrm.QueryTable(&cdp).Filter("plan_name__contains", planName).Filter("customers__customer_name__contains", customersName).RelatedSel().All(&cdps)
		} else {
			//用户名称有
			_, err = newOrm.QueryTable(&cdp).Filter("plan_name__contains", planName).RelatedSel().All(&cdps)
			if err != nil {
				fmt.Println(err)
				errCode := 500
				newError := util.NewError(errCode)
				c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
				c.ServeJSON()
				return
			}
		}
	} else {
		//客户名称作为查询条件
		_, err = newOrm.QueryTable(&cdp).Filter("customers__customer_name__contains", customersName).RelatedSel().All(&cdps)
	}
	c.Data["page"] = pagination
	c.Data["cdp"] = cdps
	c.TplName = "cdtables.html"
	//这里可以直接返回已经渲染好的页面的代码给ajax的data
}
